home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / Misc / a2 / Source / mem.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-03-21  |  3.3 KB  |  184 lines

  1. /*
  2.  *  a2, an Apple II emulator in C
  3.  *  (c) Copyright 1990 by Rich Skrenta
  4.  *
  5.  *  Command line interface written by Tom Markson
  6.  *
  7.  *  Distribution agreement:
  8.  *
  9.  *    You may freely copy or redistribute this software, so long
  10.  *    as there is no profit made from its use, sale, trade or
  11.  *    reproduction.  You may not change this copyright notice,
  12.  *    and it must be included prominently in any copy made.
  13.  *
  14.  *  Send emulator related mail to:  skrenta@blekko.commodore.com
  15.  *                    skrenta@blekko.uucp
  16.  */
  17.  
  18.  
  19. #import    <stdio.h>
  20. #import    <libc.h>
  21. #import    "a2.h"
  22.  
  23.  
  24. unsigned char mem[65536];        /* 64K memory image */
  25. unsigned char jmp_tbl[65536];        /* jmp & jsr interceptor functions */
  26. void (*mem_set[256])(unsigned short, unsigned char);/* memory store interceptors */
  27.  
  28. unsigned char rom[0x3000];
  29. unsigned char ram[0x2000];
  30. unsigned char bank1[0x1000];
  31. unsigned char bank2[0x1000];
  32.  
  33.  
  34. int ram_read = 0;
  35. int ram_write = 0;
  36. int bank2_enable = 0;
  37.  
  38. #ifdef NeXT
  39. #define ram_copy(f,t,l) memcpy(t,f,l)
  40. #else
  41. ram_copy(from, to, len)
  42. unsigned char *from;
  43. unsigned char *to;
  44. int len;
  45. {
  46.  
  47.     while (len--)
  48.         *to++ = *from++;
  49. }
  50. #endif
  51.  
  52. /*
  53.  *  Write protect/unprotect D000-FFFF
  54.  */
  55. void writep(void (*fn)(unsigned short, unsigned char))
  56. {
  57. int i;
  58.  
  59.     for (i = 0xD0; i <= 0xFF; i++)
  60.         mem_set[i] = fn;
  61. }
  62.  
  63. void set_writep(unsigned short a, unsigned char n)
  64. {
  65.   /* Just eat it. */
  66. }
  67.  
  68. void set_ramwrite(unsigned short a, unsigned char n)
  69. {
  70.  
  71.     if (a >= 0xE000)
  72.         ram[a - 0xE000] = n;
  73.     else if (bank2_enable)
  74.         bank2[a - 0xD000] = n;
  75.     else
  76.         bank1[a - 0xD000] = n;
  77. }
  78.  
  79. void memory_setup(void)
  80. {
  81. long i;
  82.  
  83.     for (i = 0; i < 256; i++)
  84.         mem_set[i] = NULL;
  85.  
  86.     for (i = 0; i < 65536; i++)
  87.         jmp_tbl[i] = 0;
  88.  
  89.     writep(set_writep);
  90.     ram_copy(&mem[0xD000], rom, 0x3000);
  91. }
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98. void ram_card(unsigned short addr)
  99. {
  100.  
  101.     if (ram_read) {
  102.         ram_copy(&mem[0xE000], ram, 0x2000);
  103.         if (bank2_enable)
  104.             ram_copy(&mem[0xD000], bank2, 0x1000);
  105.         else
  106.             ram_copy(&mem[0xD000], bank1, 0x1000);
  107.     }
  108.  
  109.     switch (addr & 0x000F) {
  110.     case 0x00:             /* C080 */
  111.         ram_read  = 1;
  112.         ram_write = 0;
  113.         bank2_enable = 1;
  114.  
  115.         ram_copy(ram, &mem[0xE000], 0x2000);
  116.         ram_copy(bank2, &mem[0xD000], 0x1000);
  117.         writep(set_writep);
  118.         break;
  119.  
  120.     case 0x01:            /* C081 */
  121.         ram_read  = 0;
  122.         ram_write = 1;
  123.         bank2_enable = 1;
  124.  
  125.         ram_copy(rom, &mem[0xD000], 0x3000);
  126.         writep(set_ramwrite);
  127.         break;
  128.  
  129.     case 0x02:            /* C082 */
  130.         ram_read  = 0;
  131.         ram_write = 0;
  132.         bank2_enable = 1;
  133.  
  134.         ram_copy(rom, &mem[0xD000], 0x3000);
  135.         writep(set_writep);
  136.         break;
  137.  
  138.     case 0x03:            /* C083 */
  139.         ram_read  = 1;
  140.         ram_write = 1;
  141.         bank2_enable = 1;
  142.  
  143.         ram_copy(ram, &mem[0xE000], 0x2000);
  144.         ram_copy(bank2, &mem[0xD000], 0x1000);
  145.         writep(NULL);
  146.         break;
  147.  
  148.     case 0x08:             /* C088 */
  149.         ram_read  = 1;
  150.         ram_write = 0;
  151.         bank2_enable = 0;
  152.  
  153.         ram_copy(ram, &mem[0xE000], 0x2000);
  154.         ram_copy(bank1, &mem[0xD000], 0x1000);
  155.         writep(set_writep);
  156.         break;
  157.  
  158.     case 0x09:            /* C089 */
  159.         ram_read  = 0;
  160.         ram_write = 1;
  161.         bank2_enable = 0;
  162.         ram_copy(rom, &mem[0xD000], 0x3000);
  163.         writep(set_ramwrite);
  164.         break;
  165.  
  166.     case 0x0a:            /* C08A */
  167.         ram_read  = 0;
  168.         ram_write = 0;
  169.         bank2_enable = 0;
  170.         ram_copy(rom, &mem[0xD000], 0x3000);
  171.         writep(set_writep);
  172.         break;
  173.  
  174.     case 0x0b:            /* C08B */
  175.         ram_read  = 1;
  176.         ram_write = 1;
  177.         bank2_enable = 0;
  178.         ram_copy(ram, &mem[0xE000], 0x2000);
  179.         ram_copy(bank1, &mem[0xD000], 0x1000);
  180.         writep(NULL);
  181.         break;
  182.     }
  183. }
  184.